package com.lgcns.andteam2.todaymenu;

import android.content.Context;
import android.preference.DialogPreference;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TimePicker;
 
/**
 * A preference type that allows a user to choose a time.
 * http://www.ebessette.com/d/TimePickerPreference에서 복사해서 수정함.<br>
 * 1. 12/24시간제 구분을 시스템 설정을 따르도록 수정<br>
 * 2. dialog가 [확인] 버튼을 클릭하여 닫힐 때에 시간이 저장되도록 수정<br>
 * 3. callChangeListener()를 호출하여 Preference Activity에서 변경된 사항을 처리할 수 있도록 수정
 */
public class TimePickerPreference extends DialogPreference implements
        TimePicker.OnTimeChangedListener {
    
    int mHour;
    int mMinute;
 
    /**
     * The validation expression for this preference
     */
    private static final String VALIDATION_EXPRESSION = "[0-2]*[0-9]:[0-5]*[0-9]";
 
    /**
     * The default value for this preference
     */
    private String defaultValue;
 
    /**
     * @param context
     * @param attrs
     */
    public TimePickerPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }
 
    /**
     * @param context
     * @param attrs
     * @param defStyle
     */
    public TimePickerPreference(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        initialize();
    }
 
    /**
     * Initialize this preference
     */
    private void initialize() {
        setPersistent(true);
    }
 
    /*
     * (non-Javadoc)
     * 
     * @see android.preference.DialogPreference#onCreateDialogView()
     */
    @Override
    protected View onCreateDialogView() {
 
        TimePicker tp = new TimePicker(getContext());
        tp.setOnTimeChangedListener(this);
        tp.setIs24HourView(DateFormat.is24HourFormat(getContext()));
 
        int h = getHour();
        int m = getMinute();
        if (h >= 0 && m >= 0) {
            tp.setCurrentHour(h);
            tp.setCurrentMinute(m);
        }
 
        return tp;
    }
 
    /*
     * (non-Javadoc)
     * 
     * @see
     * android.widget.TimePicker.OnTimeChangedListener#onTimeChanged(android
     * .widget.TimePicker, int, int)
     */
    @Override
    public void onTimeChanged(TimePicker view, int hour, int minute) {
        mHour = hour;
        mMinute = minute;
    }
    
    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if(positiveResult) {
            persistString(mHour + ":" + mMinute);
            callChangeListener(mHour + ":" + mMinute);
        }
    }
 
    /*
     * (non-Javadoc)
     * 
     * @see android.preference.Preference#setDefaultValue(java.lang.Object)
     */
    @Override
    public void setDefaultValue(Object defaultValue) {
        // BUG this method is never called if you use the 'android:defaultValue' attribute in your XML preference file, not sure why it isn't       
 
        super.setDefaultValue(defaultValue);
 
        if (!(defaultValue instanceof String)) {
            return;
        }
 
        if (!((String) defaultValue).matches(VALIDATION_EXPRESSION)) {
            return;
        }
 
        this.defaultValue = (String) defaultValue;
    }
 
    /**
     * Get the hour value (in 24 hour time)
     * 
     * @return The hour value, will be 0 to 23 (inclusive)
     */
    private int getHour() {
        String time = getPersistedString(this.defaultValue);
        if (time == null || !time.matches(VALIDATION_EXPRESSION)) {
            return -1;
        }
 
        return Integer.valueOf(time.split(":")[0]);
    }
 
    /**
     * Get the minute value
     * 
     * @return the minute value, will be 0 to 59 (inclusive)
     */
    private int getMinute() {
        String time = getPersistedString(this.defaultValue);
        if (time == null || !time.matches(VALIDATION_EXPRESSION)) {
            return -1;
        }
 
        return Integer.valueOf(time.split(":")[1]);
    }
}